package com.example.code2022;

import com.alibaba.fastjson.JSON;

/**
 * @author: dangwen
 * @createDate: 2022/4/24
 * 238. 除自身以外数组的乘积
 * 给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
 * 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
 * 请不要使用除法，且在 O(n) 时间复杂度内完成此题。
 */
public class P238 {
    public static void main(String[] args) {
        int[] nums = new int[]{1,2,3,4};
        System.out.println(JSON.toJSONString(productExceptSelf(nums)));
    }
    public static int[] productExceptSelf(int[] nums){
        // 返回一个同长结果的数组
        int[] ans = new int[nums.length];
        // 元素自身之外的数字的乘积分为元素左侧的数字和元素右侧的数字，先从左侧遍历
        int mul = 1; // 用来和元素相乘，1乘于任何元素都为元素本身
        // ans[0]初始化为1，1乘于任何元素都为元素本身
        ans[0] = 1;
        for (int i = 1; i < nums.length; i++){
            // 这里先用ans存储左侧元素的积 左侧：i -1
            mul *= nums[i - 1];
            ans[i] = mul;
        }

        // 因为 answer[n-1]已经符合条件，倒序从n-2开始
        // 计算右侧的元素的积
        mul = 1;
        for (int i = nums.length - 2; i >= 0 ;i--){
            // 元素右侧的数字n+1
            mul *= nums[i + 1];
            // 修改该位置的结果只，索引不会变动
            ans[i] = ans[i] * mul;
        }
        return ans;
    }
}
